package com.jvtd.eyl.utils;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class TxtUtils
{
  /**
   * 判断文件的编码格式
   *
   * @return 文件编码格式
   */
  public static String codeString(String filePath) throws Exception
  {
    return codeString(new FileInputStream(filePath));
  }

  public static String codeString(InputStream inputStream) throws Exception
  {
    BufferedInputStream bis = null;
    String charset = "GBK";
    byte[] first3Bytes = new byte[3];
    boolean checked = false;
    bis = new BufferedInputStream(inputStream);
    bis.mark(0);
    int read = bis.read(first3Bytes, 0, 3);
    if (read == -1) return charset;
    if (first3Bytes[0] == (byte) 0xFF && first3Bytes[1] == (byte) 0xFE)
    {
      charset = "UTF-16LE";
      checked = true;
    } else if (first3Bytes[0] == (byte) 0xFE && first3Bytes[1] == (byte) 0xFF)
    {
      charset = "UTF-16BE";
      checked = true;
    } else if (first3Bytes[0] == (byte) 0xEF && first3Bytes[1] == (byte) 0xBB && first3Bytes[2]
        == (byte) 0xBF)
    {
      charset = "UTF-8";
      checked = true;
    }

    bis.mark(0);
    if (!checked)
    {
      while ((read = bis.read()) != -1)
      {
        if (read >= 0xF0) break;
        if (0x80 <= read && read <= 0xBF) // 单独出现BF以下的，也算是GBK
          break;
        if (0xC0 <= read && read <= 0xDF)
        {
          read = bis.read();
          if (0x80 <= read && read <= 0xBF) // 双字节 (0xC0 - 0xDF)
            // (0x80 - 0xBF),也可能在GB编码内
            continue;
          else break;

        } else if (0xE0 <= read && read <= 0xEF)
        {// 也有可能出错，但是几率较小
          read = bis.read();
          if (0x80 <= read && read <= 0xBF)
          {
            read = bis.read();
            if (0x80 <= read && read <= 0xBF)
            {
              charset = "UTF-8";
              break;
            } else break;
          } else break;
        }
      }
    }
    bis.close();
    return charset;
  }

  /**
   * 获取txt文本字符串
   *
   * @author Chenlei
   * created at 2018/8/28
   **/
  public static List<String> getTxtString(String filePath) throws Exception
  {
    return getTxtString(new FileInputStream(filePath), codeString(filePath));
  }

  public static List<String> getTxtString(InputStream inputStream, String code) throws Exception
  {
    InputStreamReader inputStreamReader;
    inputStreamReader = new InputStreamReader(inputStream, code);
    BufferedReader reader = new BufferedReader(inputStreamReader);
    String line;
    List<String> mStrings = new ArrayList<>();
    StringBuilder sb = new StringBuilder("");
    int len = 0;
    int index = 0;
    while ((line = reader.readLine()) != null)
    {
      if (len != 0)
      {// 处理换行符的问题，第一行不换行
        sb.append("\r\n");
        sb.append(line);
      } else sb.append(line);
      len++;
      if (index == 10){
        mStrings.add(sb.toString());
        sb = new StringBuilder("");
        index = 0;
      }else
        index++;
    }
    if (index != 0){
      mStrings.add(sb.toString());
    }
    inputStream.close();
    return mStrings;
  }
}
